package com.hinnotek.amoeba.ui.fragment

import android.os.Bundle
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment

/**
 * Created by Frank on 2018/9/20.
 */
/**
 * Fragment预加载问题的解决方案：
 * 1.可以懒加载的Fragment
 * 2.切换到其他页面时停止加载数据（可选）
 * Created by yuandl on 2016-11-17.
 * blog ：http://blog.csdn.net/linglongxin24/article/details/53205878
 */
abstract class LazyLoadFragment : Fragment() {
    /**
     * 视图是否已经初初始化
     */
    protected var isInit = false
    protected var isLoad = false
    protected val TAG = "LazyLoadFragment"

    /**
     * 获取设置的布局
     *
     * @return
     */
    protected var contentView: View? = null
        private set

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        contentView = inflater.inflate(setContentView(), container, false)
        isInit = true
        /**初始化的时候去加载数据 */
        isCanLoadData
        return contentView
    }

    /**
     * 视图是否已经对用户可见，系统的方法
     */
    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        isCanLoadData
    }

    /**
     * 是否可以加载数据
     * 可以加载数据的条件：
     * 1.视图已经初始化
     * 2.视图对用户可见
     */
    private val isCanLoadData: Unit
        private get() {
            if (!isInit) {
                return
            }
            if (userVisibleHint) {
                lazyLoad()
                isLoad = true
            } else {
                if (isLoad) {
                    stopLoad()
                }
            }
        }

    /**
     * 视图销毁的时候讲Fragment是否初始化的状态变为false
     */
    override fun onDestroyView() {
        super.onDestroyView()
        isInit = false
        isLoad = false
    }

    protected fun showToast(message: String?) {
        if (!TextUtils.isEmpty(message)) {
            Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
        }
    }

    /**
     * 设置Fragment要显示的布局
     *
     * @return 布局的layoutId
     */
    protected abstract fun setContentView(): Int

    /**
     * 找出对应的控件
     *
     * @param id
     * @param <T>
     * @return
    </T> */
    protected fun <T : View?> findViewById(id: Int): T {
        return contentView!!.findViewById<View>(id) as T
    }

    /**
     * 当视图初始化并且对用户可见的时候去真正的加载数据
     */
    protected abstract fun lazyLoad()

    /**
     * 当视图已经对用户不可见并且加载过数据，如果需要在切换到其他页面时停止加载数据，可以覆写此方法
     */
    protected fun stopLoad() {}
}